﻿#pragma once

/*155. 最小栈
设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
*/
#include <deque>

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack():minVal(INT_MIN)
    {    
    }

    void push(int x) {
        if (x < minVal)
            minVal = x;

        valDeq.push_back(x);
    }

    void pop() {
        valDeq.pop_back();

        if (valDeq.size() <= 0)
            minVal = INT_MAX;
        else
            minVal = valDeq[0];
        for (int i = 0; i < valDeq.size(); i++)
        {
            if (minVal >= valDeq[i])
                minVal = valDeq[i];
        }       
    }

    int top() {
        return valDeq.back();        
    }

    int getMin() {
        return minVal;
    }

private:
    int minVal; //最小值
    std::deque<int> valDeq;
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */